package com.cy.pj.modules.controller;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;

/**
 * http://localhost/doConvertMapToJson
 *   当时用这个注解描述控制层方法是,假如此方法的返回值类型为
 *    Map或pojo对象,系统底层会将这样的对象转换为json格式字符串,然后响应到客户端
 *    1)在当前应用中这个json格式的字符串会写到http协议的哪一部分,然后响应到客户端?(http响应体)
 *    2)谁将这个map转换为了json格式字符串? springboot工程默认使用的是jackson(这组依赖
 *    是我们项目中添加spring web依赖时自动添加的)
 */
//@RestController相当于类上同时写了@ResponseBody  @Controller
//@ResponseBody//相当于此类中的所有方法上都写了这个注解
@Controller
public class JsonController {
    @RequestMapping("doConvertMapToJson")
    @ResponseBody
    public Map<String,Object> doConvertMapToJson(){
       Map<String,Object> map=new HashMap<>();
       map.put("state", 1);
       map.put("message", "ok");
       return map;
    }
    @RequestMapping("doPrintJsonToClient")
    @ResponseBody
    public String doPrintJsonToClient() throws JsonProcessingException {
        Map<String,Object> map=new HashMap<>();
        map.put("state", 1);
        map.put("message", "ok");
        //将map手动转换为json字符串
        ObjectMapper objectMapper = new ObjectMapper();
        String s = objectMapper.writeValueAsString(map);
        System.out.println("jsonStr"+s);
        //将这个json字符串响应到客户端
        return s;//当方法使用了 @ResponseBody注解描述,则方法的返回值就不在是view
    }
    @RequestMapping("doPrintJsonToClient02")
    public void doPrintJsonToClient02(HttpServletResponse response) throws IOException {
        //String s="{\"state\":1,\"message\":\"成功\"}";
        Map<String,Object> map=new HashMap<>();
        map.put("state", 1);
        map.put("message", "成功");
        //将map手动转换为json字符串
        ObjectMapper objectMapper = new ObjectMapper();
        String s = objectMapper.writeValueAsString(map);
        System.out.println("jsonStr"+s);
        //将这个json字符串响应到客户端
       // response.setCharacterEncoding("utf-8");//设置响应数据的编码
        response.setContentType("text/json;charset=utf-8");
        //text写成test的话客户端无法解析响应数据,就会出现下载
        //告诉客户端响应数据的类型以及编码,客户端也会根据该编码显示
        PrintWriter out = response.getWriter();
        out.println(s);
        out.flush();
    }
}
